package cn.lizemin.strategy.version0;

import cn.lizemin.strategy.version0.entity.Calculator;
import cn.lizemin.strategy.version0.entity.ComputeStrategy;
import cn.lizemin.strategy.version0.entity.DivisionStrategy;
import cn.lizemin.strategy.version0.entity.MultiplyStrategy;

/**
 * @author lzm
 * @version 1.0
 * @description: TODO
 * @date 2022/4/22 10:27
 */
public class Client {
    /**
     * 程序的入口
     */
    public static void main(String[] args) {
//        Calculator cal = new Calculator();
//        int sum = cal.add(3, 5);
//        int result = cal.subtract(5, 2);
//        System.out.println("和：" + sum);
//        System.out.println("差：" + result);

        /**
         * 使用策略模式改进后, 传入不同的接口即可实现不同的策略
         */
        Calculator cal = new Calculator(new MultiplyStrategy());
        int result = cal.getResult(3, 5);
        System.out.println("积：" + result);

        Calculator cal2 = new Calculator(new DivisionStrategy());
        int result2 = cal2.getResult(8, 2);
        System.out.println("商：" + result2);

        /**
         * 如果有些策略只需要临时使用一下，可以直接现场实现，现学现用
         *
         * 存在的缺陷：每次使用新的计算方式，都需要重新new出一个计算机对象，太浪费了
         * 解决方式：将重量级的构造器替换成轻量级的set方法
         */
        Calculator cal3 = new Calculator(new ComputeStrategy() {
            @Override
            public int calculate(int num1, int num2) {
                return num1 % num2;
            }
        });
        int result3 = cal3.getResult(8, 5);
        System.out.println("余数：" + result3);

    }
}
